package day18_Reflection.demo03_Con;

import java.lang.reflect.Constructor;

//反射获取构造方法
/*
Class类中用于获取构造的方法
Constructor<?>[] getConstructors():获取所有公共构造对象的数组
Constructor<?>[] getDeclaredConstructors():获取所有构造对象的数组
Constructor<T>[] getConstructor(Class<?>... parameterTypes):返回单个公共构造方法对象
Constructor<T>[] getDeclaredConstructor(Class<?>... parameterTypes):返回单个构造方法对象

Class类中用与使用构造的方法
T newInstance(Object... initargs);根据指定的构造方法创建对象
注意:通过反射私有化构造不能直接创建对象需要通过setAccessible方法

 */
public class Test {
    public static void main(String[] args) throws Exception{
        Class<User> userClass = User.class;////获取Class对象
        //获取所有公共构造对象的数组  Constructor<?>[] getConstructors():
        Constructor<?>[] constructors = userClass.getConstructors();
        for (Constructor<?> constructor : constructors) {
            System.out.println(constructor);
            }
        System.out.println("---------");
        //获取所有构造对象的数组 Constructor<?>[] getDeclaredConstructors():
        Constructor<?>[] declaredConstructors = userClass.getDeclaredConstructors();
        for (Constructor<?> declaredConstructor : declaredConstructors) {
            System.out.println(declaredConstructor);
        }//获取当前类中的构造，没有其父类
        System.out.println("---------");
        //返回单个公共构造方法对象  Constructor<T>[] getConstructor(Class<?>... parameterTypes):
        //参数为:可变参数的Class对象
        Constructor<User> constructor = userClass.getConstructor();//里面没有参数,为无参构造
        System.out.println(constructor);
        Constructor<User> constructor1 = userClass.getConstructor(int.class);//参数为int的Class对象
        System.out.println(constructor1);
        System.out.println("--------");
        //返回单个构造方法对象  Constructor<T>[] getDeclaredConstructor(Class<?>... parameterTypes):
        Constructor<User> declaredConstructor = userClass.getDeclaredConstructor(int.class, int.class);//获取私有的
        System.out.println(declaredConstructor);
        Constructor<User> declaredConstructor1 = userClass.getDeclaredConstructor(int.class);//也可以获取公有的
        System.out.println(declaredConstructor1);
    }
}
